import numpy as np
import pandas as pd

class GenerationData:
    """
    数据生成类，负责模拟数据的生成和处理
    
    主要功能：
    - 随机生成模拟数据或从文件加载历史数据
    - 构建数据矩阵和记录矩阵
    """
    
    @staticmethod
    def generate_simulation_data(record_row=100, local=False):
        """
        从1-80的数字序列中随机选取20个数字，生成指定行数的数据
        
        参数：
            record_row (int): 使用/生成多少行数据
            local (bool): 是否使用output.csv历史数据文件(True)或随机生成(False)
            
        返回：
            tuple: 包含三个numpy数组:
                - data_matrix_all: N*21的数组，包含编号和所有选取的数字
                - data_matrix: N*20的数组，包含所有选取的数字
                - record_matrix: N*80的记录数组，标记每个数字是否出现(1表示出现，0表示未出现)
        """
        N = record_row  # 生成指定组数据
        data_matrix = np.zeros((N, 20), dtype=int)
        data_matrix_all = np.zeros((N, 21), dtype=int)  # 记录所有数字的出现情况
        if local:
            # 读取历史数据
            data_matrix_all = pd.read_csv('output.csv').to_numpy()
            data_matrix_all = data_matrix_all[-record_row:]

            data_matrix = pd.read_csv('output.csv').drop(columns='code').to_numpy()
            data_matrix = data_matrix[-record_row:]
            N = data_matrix.shape[0]
            record_matrix = np.zeros((N, 80), dtype=int)

        else:
            # 随机生成数据
            # np.random.seed(42) # 设置随机数种子，确保结果可复现
            record_matrix = np.zeros((N, 80), dtype=int)
            for i in range(N):
                # 从1-80中随机选择20个不重复的数字
                selected_numbers = np.random.choice(range(1, 81), size=20, replace=False)
                selected_numbers.sort()  # 排序，便于查看
                data_matrix[i] = selected_numbers
            
        # 填充记录矩阵
        for i in range(N):
            # 更新记录矩阵
            for num in data_matrix[i]:
                record_matrix[i, num-1] = 1  # 数字1-80对应索引0-79

        return data_matrix_all, data_matrix, record_matrix